#INCLUDE P16F877A.INC  ;SE INCLUYE LA LIBRERIA DEL MICROCONTROLADOR
#INCLUDE bancos.inc          ; SE INCLUYE MACRO PARA EL CAMBIO ENTRE BANDOS 

;-------------------DECLARACION DE REGISTROS O VARIABLES DE LA MEMORIA RAM DEL PIC A USAR EN EL PROGRAMA----------------
CBLOCK		0X20
RECEIVED,TO_TRANSMIT,TIMER1,TIMER2,TIMER3
ENDC
;-----------------------------------------------------------------------------------------------------------------------------------------------------------
	
	org	00			;VECTOR DE RESET
 	goto	INICIO
	org	04               ;VECTOR DE ATENCION A INTERRUPCIOENES
	goto	INT
	org	05               ; INICIO DE CODIGO DE PROGRAMA RUTINA PRINCIPAL
	goto	INICIO
;-----------------------------------------------------------------------------------------------------------------------------------------------------------
;-----------------------------RUTINA DE ATENCION A INTERRUPCIONES--------------------------------------------------------------------------
INT
	BCF		INTCON,GIE
	BTFSC	PIR1,RCIF ;Interrupcion generada por Rx datos
	CALL    RX
	NOP
	BSF		INTCON,GIE
	BCF		INTCON,INTF ;  BORRA BANDERA QUE CAUSO INTERRUPCION EXTERNA POR EL PIN RB0/INT0
	BCF		PIR1,RCIF; BORRA BANDERA QUE CAUSO INTERRUPCION POR RECEPCION RX DEL USART
	NOP
	RETFIE
;---------------------------------------------------------------------------------------------------------------------------------------------------------
;---------------------------------RUTINA QUE INICIALIZA LOS PARAMETROS BASICOS DEL MICRO-----------------------------------------
INICIALIZACION
		
	banco1			;CAMBIO AL BANCO UNO
	;-------------------- LAS SIGUIENTES LINEAS CONFIGURAN LOS PINES DE LOS PUERTOS COMO DE SALIDA O DE ENTRADA-------
	BSF		TRISA,4  ; PIN RA4/TOCKI COMO DE ENTRADA, PARA LA LECTRUA DE LOS PULSOS DEL ENCODER 
	BSF		TRISC,7
	BCF		TRISC,6 ;CONFIGURA EL PIN 6 DEL PUERO D (TX) COMO SE SALIDA PARA LA TRANSMISION SERIAL
	BCF		TRISB,0 ; CONFIGURA EL PIN RB0, COMO DE ENTRADA PARA LA INTERRUPCION DE LOS PUSLOS POR LECTURA DE LAS BARRAS
	;----------------------LAS SIGUIENTES LINEAS CONFIGURAN LAS INTERRUPCIONES-------------------------------------------------------
	BSF		INTCON,INTE ; HABILITA INTERRUPCION EXTERNA INT0
	BSF		INTCON,GIE  ; HABLILITADOR GLOBAL DE INTERRUPCIONES ACTIVADO.
	BSF		INTCON,PEIE ;HABILITA INTERRUPCION DE PERIFERICOS 
	BSF  	 PIE1,RCIE      ; HABILITA INTERRUPCION POR RECEPCION DEL MUDULO USART
      	MOVLW	b'00110000' ;CONFIGURA EL PIN RA4/TOCKI COMO FUENTE PARA EL TMRO
	MOVWF	OPTION_REG 
       ;-----------------------LAS SIGUIENTES LINEAS CONFIGURAN EL MUDULO USART PARA LA TX Y RX DE DATOS -----------------------
	;----------------------- CONFIGURANDO LA RX A MODO DE INTERRUPCIONES----------------------------------------------------------------
	MOVLW b'00100100'
	MOVWF TXSTA       
	MOVLW .25			;CARGA CONSTANTE DE CONFIGURACION DEL MODULO USART
	MOVWF SPBRG		; SE CARGA EL VALOR EN EL REGISTRO DE CONFIGURACION DEL USART
	banco0				; CAMBIO AL BANCO CERO
	movlw	b'10010000' ;CONFIGURACION DEL USART, HABILITA TX,RX,HABILITA MODULO 
	movwf	RCSTA	
	RETURN
;-------------------------------------------------------------------------------------------------------------------------------------------------------------	
;-----------------------------------RAUTINA PARA LA TRANSMICION DE DATOS --------------------------------------------------------------------
TX		MOVFW	TO_TRANSMIT;CARGA EL DATO A TRANSMITIR  
		MOVWF	TXREG	;SE CARGA  EL DATO EN EL REGISTRO DE TRANSMISION
banco1
wait1	BTFSS	TXSTA,TRMT
		goto	wait1
banco0
RETURN
;--------------------------------------------------------------------------------------------------------------------------------------------------------------
;------------------------RUTINA PARA LA RECEPCION DE DATOS MEDIANTE AL OCURRIR UNA INTERRUPCION -------------------------------
RX
		MOVFW	RCREG       ; SE LEE EL DATO RECEPCIONADO 
		MOVWF	RECEIVED ; SE ALMACENA EL DATO RECIVIDO PARA POSTERIOR COMPARACION
		CLRF		RCREG      ;SE BORRA EL REGIRSTRO DE RECEPCION 
		NOP
RETURN
;-------------------------------------------------------------------------------------------------------------------------------------------------------------	

;-------------------------------------RUTINA QUE COMPARA Y EJECUTA ACCIONES SEGUN EL DATO RECIBIDO---------------------------------
COMPARA
		; las siguientes tres lienas escanean si se acciona la tecla a PARA ACTIVAR CONTROL AUTOMATICO
		movlw	'r'      
		subwf	RECEIVED,W
		btfsc	STATUS,Z
		BSF		PORTD,7 ; MODO AUTOMATICO ACTIVADO CON LETRA   a
	       ; las siguientes tres lienas escanean si se acciona la tecla L MINUSCULA PARA ACTIVAR CONTROL LOCAL 	
		movlw	'm'  ;letra l
		subwf	RECEIVED,W
		btfsc	STATUS,Z
		BCF		PORTD,7 ; MODO LOCAL ACTIVADO CON LA LETRA l =L MINUSCULA
		;-------------------------------------------------------------------------------------------------------------------------------------------------------------
		; las siguientes tres lienas escanean si se acciona la tecla e PARA ENCENDER EL SISTEMA
		movlw	'a'
		subwf	RECEIVED,W
		btfsc	STATUS,Z
		BSF		PORTD,6
		; las siguientes tres lienas escanean si se acciona la tecla e PARA APAGAR EL SISTEMA
		movlw	'e'
		subwf	RECEIVED,W
		btfsc	STATUS,Z
		BCF		PORTD,6
		;-------------------------------------------------------------------------------------------------------------------------------------------------------------
		; las siguientes tres lienas escanean si se acciona la tecla e PARA HACER GIRO A LA DERECHA
		movlw	'i'
		subwf	RECEIVED,W
		btfsc	STATUS,Z
		BSF		PORTD,5
		; las siguientes tres lienas escanean si se acciona la tecla e PARA HACER GIRO A LA IZQUIERDA
		movlw	'd'
		subwf	RECEIVED,W
		btfsc	STATUS,Z
		BCF		PORTD,5
		
		RETURN
;-------------------------------------------------------------------------------------------------------------------------------------------------------------	

;-------------------------------------------------------------------------------------------------------------------------------------------------------------	
;----------------------------RUTINA PRINCIPAL DEL PROGRAMA--------------------------------------------------------------------------------------
INICIO
			CALL		INICIALIZACION
			CLRF		TMR0   ;BORRA EL CONTENIDO DEL REGISTRO TMR0
			CLRF		PORTB  
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
STOP		BTFSS		PORTA,4
        		GOTO		STOP	

CUENTE		BCF			PORTB,0;PILOTO DE ESCANEO DE TRANSMISION APAGADO
			CALL		ESCANEO
			CALL		TX
			NOP
			BSF			PORTB,0 ;PILOTO DE ESCANEO DE TRANSMISION ENCENDIDO
			CALL		ESCANEO
			CALL		TX
			NOP
			GOTO		CUENTE
;-------------------------------------------------------------------------------------------------------------------------------------------------------------			
ESCANEO	
			CLRF	TMR0
			movlw	.13
			movwf	TIMER3
nivel3		movlw	.250
			movwf	TIMER2
nivel2		movlw	.250
			movwf	TIMER1
nivel1		MOVFW	TMR0; SE CARGA EL VALOR DE EL MUESTREO QUE SE ALMACENA EN TMR0
			MOVWF	TO_TRANSMIT; SE CARGA EL VALOR DEL MUESTREO EN EL REGITRO DE TRANSMICION
			decfsz	TIMER1,1	;un ciclo de estas caracteristeristicas se comporta de
			goto	nivel1     	;siguiente manera   tiempo=(Cant_registro*Ciclos_instruccion)-1
			decfsz	TIMER2,1	;este ciclo controla el segundo nivel de iteracion
			goto	nivel2
			decfsz	TIMER3,1	;este ciclo controla el tercer nivel de iteracion
			goto	nivel3
			RETLW	.0
;CON LOS VALORES TIMER1=250,TIMER2=250,TIMER3=16
; TIEMPO APROX = 250X250X16=1000000uS =1SEG
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
END
;------------------------------------------------------------------------------------------------------------------------------------------